package com.suny.fork_join;

import java.util.concurrent.RecursiveTask;

/**
 * 带返回值
 *  创建一个表示工作总量的对象
 *  选择合适的阈值
 *  定义分割工作的方法
 *  定义执行工作的方法
 */
public class CustomRecursiveTask extends RecursiveTask<Integer> {

      private int threshold = 2;

      private int[] array; // the data array

      private int index0 = 0;
      private int index1 = 0;

      public CustomRecursiveTask(int[] array, int index0, int index1) {
          this.array = array;
          this.index0 = index0;
          this.index1 = index1;
      }

      @Override
      protected Integer compute() {
          int max = Integer.MIN_VALUE;
          if ((index1 - index0) <= threshold) {

              for (int i = index0;i <= index1; i ++) {
                  max = Math.max(max, array[i]);
              }

          } else {
              //fork/join
              int mid = index0 + (index1 - index0) / 2;
              CustomRecursiveTask lMax = new CustomRecursiveTask(array, index0, mid);
              CustomRecursiveTask rMax = new CustomRecursiveTask(array, mid + 1, index1);

              //fork()将任务提交给线程池，但不会触发任务的执行
              lMax.fork();
              rMax.fork();

              //join()方法则用于触发任务的执行。在 RecursiveAction 的情况下，join() 返回 null，但对于 RecursiveTask<V> ，它返回任务执行的结果。
              int lm = lMax.join();
              int rm = rMax.join();

              max = Math.max(lm, rm);

          }

          return max;
      }
  }